package com.ms.game.db;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Set;

import com.ms.db.model.basic.ModelCfg;
import com.ms.game.db.util.Utility;

/**
 * 数据库缓存类
 * @author Bany
 *
 */
public class DBCache {
	
	/**
	 * 类与类所对应字段的缓存
	 */
	@SuppressWarnings("unchecked")
	private static HashMap<Class,Field[]> classFieldCache=new HashMap<Class, Field[]>();
	
	/**
	 * VO与PO字段的映射缓存
	 */
	private static HashMap<Field,Field> fieldMappingCache=new HashMap<Field, Field>();
	
	static{
		
		Set<Class<?>> clazzs=ModelCfg.mappingClass.keySet();
		for(Class<?> clazz:clazzs){
			classFieldCache.put(clazz, Utility.getAllFieldToCache(clazz));
		}
		Field mField;
		for(Class<?> clazz:clazzs){
			Field[] fields=getFields(clazz);
			Class<?> mappingClass=ModelCfg.mappingClass.get(clazz);
			for(Field field:fields){
				mField=Utility.getField(mappingClass, field.getName());
				fieldMappingCache.put(field, mField);
				fieldMappingCache.put(mField, field);
			}
		}
	}

	/**
	 * 通过类得到所有的类字段
	 * @param clazz 类
	 * @return 字段数组
	 */
	public static Field[] getFields(Class<?> clazz){
		return classFieldCache.get(clazz);
	}
	
	/**
	 * 设置类与类对应字段的缓存
	 * @param clazz 类
	 */
	public static void setFields(Class<?> clazz){
		classFieldCache.put(clazz,Utility.getAllFieldToCache(clazz));
	}
	
	/**
	 * 设置类与类对应字段的缓存
	 * @param clazz 类
	 * @param fields 类的对应字段
	 */
	public static void setFields(Class<?> clazz,Field[] fields){
		classFieldCache.put(clazz,fields);
	}
	
	/**
	 * VO与PO对应的映射字段
	 * @param field 原字段
	 * @return 映射字段
	 */
	public static Field getMappingField(Field field){
		return fieldMappingCache.get(field);
	}
	
	/**
	 * 设置VO与PO字段对应的映射关系
	 * @param origField 原字段
	 * @param destField 目标字段
	 */
	public static void setMappingField(Field origField,Field destField){
		fieldMappingCache.put(origField, destField);
	}
	
}
